package br.unicamp.ic.engsoft.aplicacao.preletores.client;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ImageBundle;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;

/**
 * Ponto de entrada do modulo Manter preletores.
 *
 */
public class ManterPreletores implements EntryPoint {
	/**
	 * Minha interface Images eh do tipo ImageBundle (interface que faz parte da API do GWT), assim obtenho recursos desta API que
	 * tornam o carregamento de imagens uma tarefa simples a partir da abstracao desta interface.
	 * Vide javadoc de ImageBundle para mais detalhes. 
	 */
	public interface Images extends ImageBundle {
		//nome metodos conforme nome imagens no pacote br.unicamp.ic.engsoft.aplicacao.preletores.client
		AbstractImagePrototype add();
		AbstractImagePrototype addClipped();

		AbstractImagePrototype delete();
		AbstractImagePrototype deleteClipped();		

		AbstractImagePrototype update();
		AbstractImagePrototype updateClipped();
	}
	
	/**
	 * A partir de GWT.create(T) obtenho referencia a uma implementacao da interface ImageBundle. 
	 */
	private static final Images images = GWT.create(Images.class);	

	//preletores cadastrados
	private List lstPreletoresCad = new ArrayList();

	/**
	 *  Metodo onModuleLoad() eh acionado automaticamente no carregamento do modulo em questao. Eh responsavel por montar a interface
	 *  grafica com usuario como um todo ou parte desta e embuti-la numa pagina HTML (host page).  
	 */
	public void onModuleLoad() {
		final Label lblFiltro = new Label("Filtro:");

		//preletores filtrados na pesquisa
		final ListBox lstPreletoresPesq = new ListBox();

		final TextBox txtFiltro = new TextBox();
		final TextBox txtNome = new TextBox();
		final TextBox txtSobrenome = new TextBox();
		final TextBox txtEmail = new TextBox();

		//btnAdicionar
		final Image imgAdicionar = images.add().createImage();
		final Image imgAdicionarClipped = images.addClipped().createImage();
		
		final PushButton btnAdicionar = new PushButton(imgAdicionar, imgAdicionarClipped);
		btnAdicionar.addStyleDependentName("icon");
		btnAdicionar.setTitle("Adicionar preletor ao cadastro!");

		final Image imgAlterar = images.update().createImage();
		final Image imgAlterarClipped = images.updateClipped().createImage();

		final PushButton btnAlterar = new PushButton(imgAlterar, imgAlterarClipped);
		btnAlterar.addStyleDependentName("icon");
		btnAlterar.setTitle("Alterar preletor ao cadastro!");

		final Image imgRemover = images.delete().createImage();
		final Image imgRemoverClipped = images.deleteClipped().createImage();

		final PushButton btnRemover = new PushButton(imgRemover, imgRemoverClipped);
		btnRemover.addStyleDependentName("icon");
		btnRemover.setTitle("Remover preletor ao cadastro!");

		
		//btnLimpar
		Button btnLimpar = new Button();
		btnLimpar.setText("Limpar");
		btnLimpar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				txtFiltro.setText("");
				txtFiltro.setFocus(true);
				btnAdicionar.setEnabled(true);
			}
		});
		
		//adicao de tratador de evento que captura cada caractere digitado no campo de filtro
		txtFiltro.addKeyUpHandler(new KeyUpHandler() {
			public void onKeyUp(KeyUpEvent event) {
				filtrarLista(lstPreletoresPesq, txtFiltro.getText());
			}
		});

		//adicao de tratador de evento que captura o clique no botao 'Adicionar'
		btnAdicionar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {				
				if(txtNome.getText().equals("")) {
					Window.alert("O campo nome e obrigatorio");
					txtNome.setFocus(true);
				} else if(txtSobrenome.getText().equals("")) {
					Window.alert("O campo sobrenome e obrigatorio");
					txtSobrenome.setFocus(true);
				} else if(txtEmail.getText().equals("")) {
					Window.alert("O campo email e obrigatorio");
					txtEmail.setFocus(true);
				} else {
					adicionarPreletor(lstPreletoresPesq, txtNome.getText(), txtSobrenome.getText(),
							txtEmail.getText(), txtFiltro.getText());
					txtNome.setText("");
					txtSobrenome.setText("");
					txtEmail.setText("");
					txtNome.setFocus(true);
				}
			}
		});

		btnAlterar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int index = lstPreletoresPesq.getSelectedIndex();
				Preletor preletor = new Preletor();
				preletor.setNome(txtNome.getText());
				preletor.setSobrenome(txtSobrenome.getText());
				preletor.setEmail(txtEmail.getText());
				
				lstPreletoresPesq.setItemText(index, preletor.toString());
				lstPreletoresCad.set(index, preletor);
				btnAdicionar.setEnabled(true);
				
			}
		});
		
		btnRemover.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int index = lstPreletoresPesq.getSelectedIndex();
				if(index == -1) {
					Window.alert("E necessario marcar o item na lista que se deseja excluir!");
				} else {
					lstPreletoresPesq.removeItem(index);
					lstPreletoresCad.remove(index);
					btnAdicionar.setEnabled(true);
				}
			}
		});
		
		lstPreletoresPesq.setVisibleItemCount(5);
		lstPreletoresPesq.setSize("440", "110");
		
		lstPreletoresPesq.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int index = lstPreletoresPesq.getSelectedIndex();
				Preletor preletor = (Preletor) lstPreletoresCad.get(index);
				txtNome.setText(preletor.getNome());
				txtSobrenome.setText(preletor.getSobrenome());
				txtEmail.setText(preletor.getEmail());
				btnAdicionar.setEnabled(false);
				
			}
		});

		txtFiltro.setMaxLength(25);
		txtNome.setMaxLength(25);
		txtSobrenome.setMaxLength(25);
		txtEmail.setMaxLength(40);

		txtNome.setFocus(true);

		//embutir widgets em elementos da pagina host
		RootPanel.get("lblFiltro").add(lblFiltro);
		RootPanel.get("txtFiltro").add(txtFiltro);
		RootPanel.get("lstPreletoresPesq").add(lstPreletoresPesq);
		RootPanel.get("txtNome").add(txtNome);
		RootPanel.get("txtSobrenome").add(txtSobrenome);
		RootPanel.get("txtEmail").add(txtEmail);
		RootPanel.get("btnAdicionar").add(btnAdicionar);
		RootPanel.get("btnAlterar").add(btnAlterar);
		RootPanel.get("btnLimpar").add(btnLimpar);
		RootPanel.get("btnRemover").add(btnRemover);
		
	}

	/**
	 * 
	 * @param list (lista de preletores filtrados na pesquisa)
	 * @param nome
	 * @param sobrenome
	 * @param email
	 * @param filtro
	 */
	private void adicionarPreletor(ListBox list, String nome,
			String sobrenome, String email, String filtro) {

		Preletor novoPreletor = new Preletor(nome, sobrenome, email);
	
		list.addItem(novoPreletor.toString());
		lstPreletoresCad.add(novoPreletor);
		filtrarLista(list, filtro);
	}
	
	/**
	 * 
	 * @param lista (lista de preletores filtrados na pesquisa)
	 * @param filtro
	 */
	private void filtrarLista(ListBox lista, String filtro) {
		lista.clear();
		for (int i = 0; i < lstPreletoresCad.size(); i++) {
			Preletor preletor = (Preletor) lstPreletoresCad.get(i);
			if (preletor.getNomePorExtenso().indexOf(filtro) != -1) {
				lista.addItem(preletor.toString());
			}
		}
	}
}